#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <wsim/websocket_server.h>

#include <sys/shm.h>  // shared memory
#include <sys/sem.h>  // semaphore
#include <sys/msg.h>  // message queue
#include <string.h>   // memcpy

#include "wsim_server.h"


int main(void) {
    key_t key;
    int shmid, semid, msqid;
    char *shm;
    struct msg_form msg;
   
    pid_t pid;
    // 获取key值
    if((key = ftok(".", 'z')) < 0)
    {
        perror("ftok error");
        exit(1);
    }

    // 获取共享内存
    if((shmid = shmget(key, FIFO_SIZE, 0)) == -1)
    {
        perror("shmget error");
        exit(1);
    }

    // 连接共享内存
    shm = (char*)shmat(shmid, 0, 0);
    if((int)shm == -1)
    {
        perror("Attach Shared Memory Error");
        exit(1);
    }

    // 创建消息队列
    if ((msqid = msgget(key, 0)) == -1)
    {
        perror("msgget error");
        exit(1);
    }

    // 获取信号量
    if((semid = semget(key, 0, 0)) == -1)
    {
        perror("semget error");
        exit(1);
    }
// 读数据
    CLEAR();//清屏
    MOVETO(2,0);//定位光标    
    printf("index\t\tfd\t\tstatus\t\tbufLen\t\tthreadID\n");  
    HIDE_CURSOR();
    
    if((pid = fork()) == -1)
        perror("Fork Error");
    else if(pid == 0) /*子进程*/
    {
        while(1)
        {
        char c;        
        //scanf("%c", &c);
        c=getchar();
        if (c=='q')
        {            
            
                msg.mtype = 9753;
                msg.mtext = 'q';
                msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
                
                break;
           }
           else{         
                /*清空标准输入缓冲区*/
                while((c=getchar())!='\n' && c!=EOF);
            }
        }
    }
    else  /*父进程*/
    {
        while(1)
        {
        msgrcv(msqid, &msg, 1, 9753, 0); /*读取类型为9753的消息*/
        if(msg.mtext == 'q')  /*quit - 跳出循环*/
            break;
        else if(msg.mtext == 'r')  /*read - 读共享内存*/
        {
              
            sem_p(semid);            
            epollFD_info* pdata=(epollFD_info*)shm;
            MOVETO(pdata->fd,0);//定位光标
            ROWCLEAR();
            if(strcmp(pdata->status,"closeed")==0)
            printf("\033[40;31m");
            else if(strcmp(pdata->status,"forward")==0)
            printf("\033[40;32m");
            else if(strcmp(pdata->status,"accept")==0)
            printf("\033[40;33m");
            else printf("\033[40;37m");
            printf("%d\t\t%d\t\t%s\t\t%d\t\t%ld\n",pdata->index,pdata->fd,pdata->status,pdata->bufLen,pdata->threadID);
            sem_v(semid);
        }
        
        }
    }

    

    // 断开连接
    shmdt(shm);

    return 0;
}